'use strict';

const db = uniCloud.database();
const userCollection = db.collection('users');
const verifyCodeCollection = db.collection('verify_codes');

// 模拟发送短信的函数
async function sendSMS(phone, code) {
	console.log(`向手机号 ${phone} 发送验证码: ${code}`);
	// 在实际环境中，这里应该调用短信服务商的API
	return true;
}

// 模拟发送邮件的函数
async function sendEmail(email, code) {
	console.log(`向邮箱 ${email} 发送验证码: ${code}`);
	// 在实际环境中，这里应该调用邮件服务API
	return true;
}

// 生成6位随机验证码
function generateVerifyCode() {
	return Math.floor(100000 + Math.random() * 900000).toString();
}

exports.main = async (event, context) => {
	const { phone, email, type } = event;
	const { CLIENTIP } = context;
	
	// 参数校验
	if ((!phone && !email) || !type) {
		return {
			code: 1,
			message: '参数不完整'
		};
	}
	
	// 验证类型
	const validTypes = ['bindPhone', 'bindEmail', 'resetPassword'];
	if (!validTypes.includes(type)) {
		return {
			code: 2,
			message: '不支持的验证类型'
		};
	}
	
	try {
		// 查询用户
		let userQuery = {};
		let sendTo = '';
		
		if (phone) {
			userQuery.mobile = phone;
			sendTo = phone;
		} else if (email) {
			userQuery.email = email;
			sendTo = email;
		}
		
		// 如果是重置密码，需要验证手机号或邮箱是否已绑定
		if (type === 'resetPassword') {
			const userResult = await userCollection.where(userQuery).get();
			if (userResult.data.length === 0) {
				return {
					code: 3,
					message: phone ? '该手机号未注册' : '该邮箱未注册'
				};
			}
		}
		
		// 生成验证码
		const verifyCode = generateVerifyCode();
		
		// 计算过期时间（10分钟后）
		const expireTime = Date.now() + 10 * 60 * 1000;
		
		// 保存验证码
		await verifyCodeCollection.add({
			target: sendTo,
			code: verifyCode,
			type: type,
			expire_time: expireTime,
			create_time: Date.now(),
			ip: CLIENTIP,
			status: 0 // 0-未使用, 1-已使用, 2-已过期
		});
		
		// 发送验证码
		let sendResult = false;
		if (phone) {
			sendResult = await sendSMS(phone, verifyCode);
		} else if (email) {
			sendResult = await sendEmail(email, verifyCode);
		}
		
		if (!sendResult) {
			return {
				code: 4,
				message: '验证码发送失败，请稍后重试'
			};
		}
		
		return {
			code: 0,
			message: '验证码发送成功',
			data: {
				// 开发环境直接返回验证码，方便测试
				// 生产环境应该移除此字段
				code: verifyCode
			}
		};
	} catch (e) {
		console.error('发送验证码错误:', e);
		return {
			code: 500,
			message: '服务器错误'
		};
	}
}; 